/******************************************************************************************
Copyright(C), 2019-2020, Linyar.
文件名：L_SVP_NNIE_model.h
作者：燕卫博	版本：V1.1	创建日期：2021.5.27
文件描述：
    头文件。
版本信息：
    9Hv2，个人。
历史修改记录：
1. 2021-5-27:V1.1 燕卫博
从STv8拷贝更改。

2. 2021-8-11:V1.0 燕卫博
从9Hv1拷贝，接续使用。
******************************************************************************************/

#ifndef __L_SVP_NNIE_MODEL__
#define __L_SVP_NNIE_MODEL__
//                                              ↓
//+------------------------------------------------------------------------------------------+
//|                                         头文件包含
//+------------------------------------------------------------------------------------------+
/*|*/  #include <stdio.h>
/*|*/  #include <string.h>
/*|*/  #include <fcntl.h>
/*|*/  #include <math.h>
/*|*/
//+------------------------------------------------------------------------------------------+
/*|*/  #include "hi_common.h"
/*|*/  #include "hi_comm_sys.h"
/*|*/  #include "hi_comm_svp.h"
/*|*/  #include "hi_nnie.h"
/*|*/  #include "hi_ive.h"
/*|*/  #include "mpi_sys.h"
/*|*/  #include "mpi_nnie.h"
//+------------------------------------------------------------------------------------------+
//|                                         程序宏定义
//+------------------------------------------------------------------------------------------+
/*|*/  #define SVP_NNIE_QUANT_BASE 4096
/*|*/  #define MAX_DETECTION_NUM 10
//|    ------------------------------------------------------------
//|    一些工具宏
//|    ------------------------------------------------------------
/*|*/  /*16Byte对齐*/
/*|*/  #define SVP_NNIE_ALIGN_16 16
/*|*/  #define SVP_NNIE_ALIGN16(u32Num) (((u32Num+16-1)/16)*16)
/*|*/  /*32Byte对齐*/
/*|*/  #define SVP_NNIE_ALIGN_32 32
/*|*/  #define SVP_NNIE_ALIGN32(u32Num) (((u32Num+32-1)/32)*32)
/*|*/  /*256Byte对齐*/
/*|*/  #define SVP_NNIE_ALIGN_256 256
/*|*/  #define SVP_NNIE_ALIGN256(u32Num) (((u32Num+256-1)/256)*256)
//|
/*|*/  #define SVP_NNIE_MAX(a,b)   (((a)>(b))?(a):(b))
/*|*/  #define SVP_NNIE_MIN(a,b)   (((a)<(b))?(a):(b))
/*|*/  #define SVP_NNIE_SIGMOID(x) (HI_FLOAT)(1.0f/(1+exp(-x)))
//+------------------------------------------------------------------------------------------+
//|                                     用于调试的宏定义
//+------------------------------------------------------------------------------------------+
//|    #define __L_SVP_NNIE_DEBUG
/*|*/  #define __L_SVP_NNIE_INFO
/*|*/  #define __L_SVP_NNIE_ERROR
//+------------------------------------------------------------------------------------------+
/*|*/  #ifdef __L_SVP_NNIE_DEBUG //Debug用于程序测试点输出，如关键值、分支位置和判断结果等
/*|*/  #define LOGD(format,...) printf(format,##__VA_ARGS__)
/*|*/  #else
/*|*/  #define LOGD(format,...)
/*|*/  #endif
/*|*/
/*|*/  #ifdef __L_SVP_NNIE_INFO //Info用于指示程序执行进度，用于关键点输出
/*|*/  #define LOGI(format,...) printf(format,##__VA_ARGS__)
/*|*/  #else
/*|*/  #define LOGI(format,...)
/*|*/  #endif
/*|*/
/*|*/  #ifdef __L_SVP_NNIE_ERROR //Error指示程序运行中遇到的意外的错误，如函数执行失败等
/*|*/  #define LOGE(format,...) printf(format,##__VA_ARGS__)
/*|*/  #else
/*|*/  #define LOGE(format,...)
/*|*/  #endif
//+------------------------------------------------------------------------------------------+
//|  信息输出格式规定如下：
//|     [SVP-NNIE-level]function:message(return value or something...)...
//|  其中，“level”表示消息等级，如DEBUG、INFO和ERROR；“function”表示信息相关函数名；
//|  “message”表示日志信息。
//+------------------------------------------------------------------------------------------+
//|                                        自定义结构体
//+------------------------------------------------------------------------------------------+
/*|*/  typedef struct l_svp_nnie_yolo_output_bbox_s
/*|*/  {
/*|*/      HI_U32 u32Xmin;
/*|*/      HI_U32 u32Ymin;
/*|*/      HI_U32 u32Xmax;
/*|*/      HI_U32 u32Ymax;
/*|*/      HI_FLOAT f32ObjectProb;
/*|*/      HI_U32 u32ClassIndex;
/*|*/  }SVP_NNIE_YOLO_OUTPUT_BBOX_S;
//+------------------------------------------------------------------------------------------+
//|                                       函数/变量声明
//+------------------------------------------------------------------------------------------+
/*|*/  int  L_SVP_NNIE_Init(const char *ppath_to_wk_file);
/*|*/  void L_SVP_NNIE_DeInit(void);
/*|*/  int  L_SVP_NNIE_LoadData(const char *ppath_to_bgr_file, const IVE_IMAGE_S *pstFrameInfo);
/*|*/  int  L_SVP_NNIE_Forward(void);
/*|*/  void L_SVP_NNIE_GetResult(SVP_NNIE_YOLO_OUTPUT_BBOX_S **ppstoutputbbox, int *poutputbboxnum);
//+------------------------------------------------------------------------------------------+

#endif
